package com.sojson.util.encrypt.bothway.alike.base64;

import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import com.sojson.util.StringUtil;
import com.sojson.util.encrypt.EncryptUtil;

/**
 * Base4双向加解密工具类
 * 
 * @author liu
 * @date 2020-09-04
 */
public class Base64Util {

    private final static Encoder ENCODER = Base64.getEncoder();
    private final static Decoder DECODER = Base64.getDecoder();

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static String encrypt(String data) {
        return encryptToStr(data.getBytes());
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static byte[] encrypt(byte[] data) {
        return ENCODER.encode(data);
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static byte[] encryptToByte(String data) {
        return encrypt(data.getBytes());
    }

    /**
     * 加密
     * 
     * @param data
     * @return
     */
    public static String encryptToStr(byte[] data) {
        return ENCODER.encodeToString(data);
    }

    /**
     * 加密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String encrypt(String data, String key) {
        return encryptToStr(data.getBytes(), key);
    }

    /**
     * 加密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] encrypt(byte[] data, String key) {
        if (StringUtil.isNotBlankObject(key)) {
            data = EncryptUtil.keyEncrypt(data, key);
        }

        return encrypt(data);
    }

    /**
     * 加密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] encryptToByte(String data, String key) {
        return encrypt(data.getBytes(), key);
    }

    /**
     * 加密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String encryptToStr(byte[] data, String key) {
        if (StringUtil.isNotBlankObject(key)) {
            data = EncryptUtil.keyEncrypt(data, key);
        }

        return encryptToStr(data);
    }

    /**
     * 解密
     * 
     * @param data
     * @return
     */
    public static String decrypt(String data) {
        return new String(decryptToByte(data));
    }

    /**
     * 解密
     * 
     * @param data
     * @return
     */
    public static byte[] decrypt(byte[] data) {
        return DECODER.decode(data);
    }

    /**
     * 解密为数组
     * 
     * @param data
     * @return
     */
    public static byte[] decryptToByte(String data) {
        return DECODER.decode(data);
    }

    /**
     * 解密为数组
     * 
     * @param data
     * @return
     */
    public static String decryptToStr(byte[] data) {
        return new String(decrypt(data));
    }

    /**
     * 解密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String decrypt(String data, String key) {
        return decryptToStr(data.getBytes(), key);
    }

    /**
     * 解密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] decrypt(byte[] data, String key) {
        data = decrypt(data);

        if (StringUtil.isBlankObject(key)) {
            return data;
        }

        return EncryptUtil.keyDecrypt(data, key);
    }

    /**
     * 解密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static byte[] decryptToByte(String data, String key) {
        return decrypt(data.getBytes(), key);
    }

    /**
     * 解密
     * 
     * @param data   内容
     * @param key    密钥
     * @return
     */
    public static String decryptToStr(byte[] data, String key) {
        data = decrypt(data);

        if (StringUtil.isBlankObject(key)) {
            return new String(data);
        }

        return new String(EncryptUtil.keyDecrypt(data, key));
    }

}